#import "BattleScreen.h"
#import "State.h"
#import "WalkMap.h"
#import "Entity.h"
#import "Tile.h"
#import "Shop.h"
#import "Item.h"
#import "Gateway.h"
#import "State.h"
#define ZOOM_STEP 1.5
@interface BattleScreen (UtilityMethods)
- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center;
@end

@implementation BattleScreen
@synthesize tiles,enemies,party,npcs,gateways;
@synthesize tileSet,enemySet,spriteSet,npcSet,gatewaySet;
@synthesize tileSize, /*enemysize,*/spriteSize;//,npcSize,gatewaySize;

-(id) initWithFrame:(CGRect)f buffer:(Buffer*)buffer{
	[super initWithFrame:f];
    scrollscreen = [[UIScrollView alloc]initWithFrame:self.bounds];
	[scrollscreen setDelegate:self];
	[scrollscreen setBouncesZoom:YES];
	[self addSubview:scrollscreen];
	state=S_MAP_DUNGEON;	
	[self initWithProperties:buffer.stageName];
    
	return self;

}

-(NSMutableArray*) getTarget {
	NSMutableArray* target = [NSMutableArray arrayWithCapacity:20];
	for(Entity *e in enemies){
		int dx = currentPlayer.center.x - e.center.x;
		int dy = currentPlayer.center.y - e.center.y;
		if (dx ==0 && (-2 < dy < 2)) {
			[target addObject:e];
		}
		if (-1<dx<1 && (-1 < dy < 1)) {
			[target addObject:e];
		}
		if (-2 <dx <2 && ( dy =0)) {
			[target addObject:e];
		}
		
	}
	return target;
}

-(id) initWithProperties:(NSString*)name{
	NSString *plistPath = [[NSBundle mainBundle] pathForResource:name ofType:@"plist"];
	NSMutableDictionary* dic = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
    map = [[WalkMap alloc ]initWithBackground:[dic objectForKey:@"background"]];
    [scrollscreen addSubview:map];
	[scrollscreen setContentSize:map.frame.size];
    float minimumScale = [scrollscreen frame].size.width  / [map frame].size.width;
    [scrollscreen setMinimumZoomScale:minimumScale];
    [scrollscreen setZoomScale:minimumScale];
    [map setDelegate:self];

	[self initTiles:dic];
	[self initEnemies:dic];
	[self initParty:dic];
	[self initNeutrals:dic];
	[self initGateways:dic];
	return self;
}

-(void)initTiles:(NSMutableDictionary*) dic {
  	tileSize=[[dic objectForKey:@"tileSize"] intValue];
	self.tileSet = [[TileSet alloc] init:[dic objectForKey:@"tileSet"] andSize:tileSize];
    NSMutableArray* g = [dic objectForKey:@"tiles"];
	self.tiles  =[NSMutableArray arrayWithCapacity:[g count]];
    for(int i=0;i<[g count];i++){
		Tile* t = [[Tile alloc] initWithDictionary:[g objectAtIndex:i] ];
		t.set = tileSet;
 		[self.tiles addObject:t];
		[map addSubview:t];
		[map setType:TILE_WALL x:t.x y:t.y];
    }
}
-(void)initParty:(NSMutableDictionary*) dic {
  	spriteSize=[[dic objectForKey:@"spriteSize"] intValue];
	self.spriteSet = [[TileSet alloc] init:[dic objectForKey:@"spriteSet"] andSize:spriteSize];
    NSMutableArray* ppl = [dic objectForKey:@"party"];
	self.party  =[NSMutableArray arrayWithCapacity:[ppl count]];
    for(int i=0;i<[ppl count];i++){
		Entity* t = [[Entity alloc] initWithDictionary:[ppl objectAtIndex:i]];
		[self.party addObject:t];
		t.set = spriteSet;
		[map addSubview:t];
		[map setType:TILE_PEOPLE x:t.x y:t.y];
	}
}
-(void)initEnemies:(NSMutableDictionary*) dic {
 	self.enemySet = [[TileSet alloc] init:[dic objectForKey:@"enemySet"] andSize:spriteSize];
    NSMutableArray* ppl = [dic objectForKey:@"enemies"];
	self.enemies  =[NSMutableArray arrayWithCapacity:[ppl count]];
    for(int i=0;i<[ppl count];i++){
 		Shop* t = [[Shop alloc]initWithDictionary:[ppl objectAtIndex:i]];
		[self.enemies addObject:t];
		t.set = enemySet;
		[map addSubview:t];
		[map setType:TILE_ENEMY x:t.x y:t.y];
	
    }
}
-(void)initNeutrals:(NSMutableDictionary*) dic {
  	itemHeight=[[dic objectForKey:@"itemHeight"] intValue];
  	itemWidth=[[dic objectForKey:@"itemWidth"] intValue];
	self.npcSet = [[TileSet alloc] init:[dic objectForKey:@"npcSet"] andSize:itemWidth];
    NSMutableArray* ppl = [dic objectForKey:@"npcs"];
	self.npcs  =[NSMutableArray arrayWithCapacity:[ppl count]];
    for(int i=0;i<[ppl count];i++){
 		Item* t = [[Item alloc]initWithDictionary:[ppl objectAtIndex:i]];
		[self.npcs addObject:t];
		[map addSubview:t];
		t.set = npcSet;
		[map setType:TILE_NPC x:t.x y:t.y];
		
    }
}
-(void)initGateways:(NSMutableDictionary*) dic {
  	itemHeight=[[dic objectForKey:@"itemHeight"] intValue];
  	itemWidth=[[dic objectForKey:@"itemWidth"] intValue];
	self.gatewaySet = [[TileSet alloc] init:[dic objectForKey:@"itemSet"] andSize:itemWidth];
    NSMutableArray* ppl = [dic objectForKey:@"gateways"];
	self.gateways  =[NSMutableArray arrayWithCapacity:[ppl count]];
    for(int i=0;i<[ppl count];i++){
 		Gateway* t = [[Gateway alloc]initWithDictionary:[ppl objectAtIndex:i]];
		[self.gateways addObject:t];
		[map addSubview:t];
		t.set = gatewaySet;
		[map setType:TILE_GATEWAY x:t.x y:t.y];
		
    }
}
-(int)stateMachine{
	return S_MAP_DUNGEON;
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return map;
}

- (void)tapWalkMap:(WalkMap *)view gotSingleTapAtPoint:(CGPoint)tapPoint {
    [map movePalayerTo:tapPoint];
	[map.player setNeedsDisplay];
}

- (void)tapWalkMap:(WalkMap *)view gotDoubleTapAtPoint:(CGPoint)tapPoint {
    // double tap zooms in
    float newScale = [scrollscreen zoomScale] * ZOOM_STEP;
    CGRect zoomRect= [self zoomRectForScale:newScale withCenter:tapPoint];
    [scrollscreen zoomToRect:zoomRect animated:YES];
}

- (void)tapWalkMap:(WalkMap *)view gotTwoFingerTapAtPoint:(CGPoint)tapPoint {
    // two-finger tap zooms out
    float newScale = [scrollscreen zoomScale] / ZOOM_STEP;
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:tapPoint];
    [scrollscreen zoomToRect:zoomRect animated:YES];
}

#pragma mark Utility methods

- (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center {
    
    CGRect zoomRect;
    
    // the zoom rect is in the content view's coordinates. 
    //    At a zoom scale of 1.0, it would be the size of the imageScrollView's bounds.
    //    As the zoom scale decreases, so more content is visible, the size of the rect grows.
    zoomRect.size.height = [self frame].size.height / scale;
    zoomRect.size.width  = [self frame].size.width  / scale;
    
    // choose an origin so as to get the right center.
    zoomRect.origin.x    = center.x - (zoomRect.size.width  / 2.0);
    zoomRect.origin.y    = center.y - (zoomRect.size.height / 2.0);
    
    return zoomRect;
}
@end
//  public WalkPanel(WalkMap cur_map, int x, int y) {
//  
//    //X and Y are left in so that a initial camerapoint can be picked!
//    this.cur_map = cur_map;
//    
//    this.setBackground(new Color((float) 0.0, (float) 0.0, (float) 0.0));
//
//    //Camerawork code.
//    if(x<180) { Buffer.setCX(0); }
//    else if(x<cur_map.getWidth()-180) {
//      Buffer.setCX(cur_map.getWidth()-360);
//    }
//    else {
//      Buffer.setCX(x-180);  
//    }    
//    if(y<120) { Buffer.setCY(0); }
//    else if(y<cur_map.getHeight()-120) {
//      Buffer.setCY(cur_map.getHeight()-240);
//    }
//    else {
//      Buffer.setCY(y-120);  
//    }     
//    
//      //Don't forget to set the entity itself ;).
//    Buffer.Player().x=x;
//    Buffer.Player().y=y;
//    }
//    
// -(void) Update:(int)x y:(int)y {
//    this.cur_map = Buffer.getCurMap(); //necessary?
//    
//    //Camerawork code.
//    if(x<180) { Buffer.setCX(0); }
//    else if(x<(cur_map.getWidth()*24)-180) {
//      Buffer.setCX(x-180);
//    }
//    else {
//      Buffer.setCX((cur_map.getWidth()*24)-360);  
//    }    
//    if(y<120) { Buffer.setCY(0); }
//    else if(y<(cur_map.getHeight()*24)-120) {
//      Buffer.setCY(y-120);
//    }
//    else {
//      Buffer.setCY((cur_map.getHeight()*24)-240); 
//    }     
//    
//    //Minor detail: Don't forget to move the entity itself ;).
//    Buffer.Player().x=x;
//    Buffer.Player().y=y;
//    }
//    
// 
//-(void) paintComponent(Graphics g) {
//
//      super.paintComponent(g);
//
//      
//      g.setFont(Buffer.normaltxt);
//      
//      if(Buffer.ScaleRatio != 1.0) {
//        ((Graphics2D) g).scale(Buffer.ScaleRatio,Buffer.ScaleRatio);
//      }  
//      Lib_Image.renderMap(cur_map,g,this,Buffer.getCX(),Buffer.getCY(),360,240,0, 1);
//      Lib_Image.renderMap(cur_map,g,this,Buffer.getCX(),Buffer.getCY(),360,240,1, 1);
//      
//         
// 
//      
//      /* TODO: Move this to Lib_Image */
//      for(int i = 0; i < Buffer.numEnts(); i++) {
//        /* TODO: Be sure to add clipping of off screen entities !!! */
//        g.drawImage(Buffer.getEnt(i).getSprite().getFrame(Buffer.getEnt(i).f),Buffer.getEnt(i).x-Buffer.getCX(),Buffer.getEnt(i).y-Buffer.getCY(),this);
//      }
//      
//      Lib_Image.renderMap(cur_map,g,this,Buffer.getCX(),Buffer.getCY(),360,240,2,1);
//      
//      /* Layer 4 :) */
//      Lib_Image.renderMap(cur_map,g,this,Buffer.getCX(),Buffer.getCY(),360,240,6,1);
//      
//      /* Visible Obstruction Layer (for debug purposes) */
//      //Lib_Image.renderMap(cur_map,g,this,Buffer.getCX(),Buffer.getCY(),360,240,3,1);
//
//
//      //else {
//      //  Lib_Image.statsPage(g);
//      //}
//      if(WalkFrame.Mode() == 1) {
//         String temp=(Buffer.getEnt(Buffer.DetectTalk()).resptext);
//         if(temp.equals("shop") == true)
//         {
//          //this.cur_map = cur_map;
//          Shop.showshop(g,"start"); //current map parsed with it to get the shop.
//
//         }
//         else if(temp.equals("priest") == true)
//         {
//          Priest.showpriest(g);
//         }
//         else
//         {
//          //Lib_Image.textBox(g,Buffer.getEnt(Buffer.DetectTalk()).resptext);
//          Lib_Image.textBox(g,WalkFrame.TempResp());
//         }
//      }
//  }









//@end	
//	/* Constructor */
//	public BattleFrame(Walkdic cur_dic)
//	{
//	  this.setVisible(false);
//
//	  screen = new BattlePanel(cur_dic,
//	  Buffer.Player().x,
//	  Buffer.Player().y);
//
//    Buffer.getCurdic().placeMoveObs(Buffer.Player());
//
//	  timer = new Timer(Buffer.TimerDelay, this); //Timer delay.TWEAKABLE
//	  prompt = new JTextField("");
//
//    screen.setBounds(0,0,(int)(360*Buffer.ScaleRatio),(int)(240*Buffer.ScaleRatio));
//
//	  c.setLayout(null);
//
//	  c.add(screen);
//	  c.add(prompt);
//
//	  prompt.addKeyListener(this);
//    this.addWindowFocusListener(this);
//
//	  this.setVisible(true);
//
//	  startAnimation();
//	}
//
//  /* initialization after dic switches */
//	-(void) init() {
//    screen = new BattlePanel(Buffer.getCurdic(),Buffer.Player().x,Buffer.Player().y);
//    Buffer.getCurdic().placeMoveObs(Buffer.Player());
//
//    Timer timer = new Timer(Buffer.TimerDelay, this); //Timer delay. TWEAKABLE
//    JTextField prompt = new JTextField("");
//
//    screen.setBounds(0,0,(int)(360*Buffer.ScaleRatio),(int)(240*Buffer.ScaleRatio));
//
//    c.setLayout(null);
//
//    c.add(screen);
//    c.add(prompt);
//
//    JukeBox.Init();
//
//    prompt.addKeyListener(this);
//    this.addWindowFocusListener(this);
//
//    this.setVisible(true);
//
//    JukeBox.PlayWalkTune();
//    startAnimation();
//	}
//
//  /* Switch to a different dic! */
// -(void) Switchdic(String dicname)
//  {
//    stopAnimation();
//    JukeBox.StopAll();
//    this.setVisible(false);
//
//    c.remove(screen);
//    c.remove(prompt);
//
//    Lib_dic.initdic(0,this,dicname);
//
//    Buffer.firstPlayer();
//  }
//
//	public synchronized void startAnimation() {
//    timer.start();
//  }
//
//
//  public synchronized void stopAnimation() {
//    timer.stop();
//  }
//
//  private int anim_delay = Buffer.AnimDelay; //Animation delay per frame. TWEAKABLE
//  private int anim_iterator = 0;
//
//	/*
//	 * DRAWING ROUTINE
//	 */
//
//  private String movestring;
//  private char curmove;
//
//  /* Resets all movement stuff */
// -(void) resetMovement() {
//    up = 0;
//    down = 0;
//    left = 0;
//    right = 0;
//    opup = 0;
//    opdown = 0;
//    opleft = 0;
//    opright = 0;
//  }
//
// -(void) actionPerformed(ActionEvent e) {
//
//    int newdirection = 0;
//
//    /* A.I. targeting execution code!!! */
//    if(Buffer.Player().ai == true && mode == 2) {
//      if(anim_iterator == anim_delay-1) {
//        c.remove(screen);
//
//        if(Buffer.Player().range > 2 && atk_type == 0) { atk_type = 1; }
//
//        if(atk_type == 0) {
//          battle_anim = new MeleeSequencePanel(Buffer.Player(),Buffer.getEnt(targets[0]));
//          battle_anim.setBounds(0,0,(int)(360*Buffer.ScaleRatio),(int)(240*Buffer.ScaleRatio));
//
//          /* TODO: Stop local animation loop? */
//          c.add(battle_anim);
//        }
//        else if(atk_type == 1) {
//          ranged_anim = new RangedSequencePanel(Buffer.Player(),Buffer.getEnt(targets[0]));
//          ranged_anim.setBounds(0,0,360*(int)(Buffer.ScaleRatio),(int)(240*Buffer.ScaleRatio));
//
//          /* TODO: Stop local animation loop? */
//          c.add(ranged_anim);
//        }
//        this.paint(this.getGraphics());
//        mode = 5;
//        JukeBox.PlayBattleTune();
//      }
//    }
//
//    /* A.I. movescript execution code!!! */
//    if(Buffer.Player().ai == true && mode == 0) {
//
//      // Clear old moves
//      if(curmove != ' ' && Buffer.Player().y%24 == 0 && Buffer.Player().x%24 == 0
//         && left != 3 && right != 3 && up != 3 && down != 3) {
//        curmove = ' ';
//        up = 0;
//        down = 0;
//        left = 0;
//        right = 0;
//        newdirection = 1;
//      }
//
//      // Grab next move from the movescript!
//      if(curmove == ' ') {
//        if(movestring.charAt(0) == 'r') {
//          right   = 1;
//          opright = 1;
//          left    = 0;
//          Buffer.Player().f = 2 + Buffer.anim_toggle;
//          curmove = 'r';
//          movestring = movestring.substring(1);
//          //System.out.println("r:"+movestring);
//        }
//        else if(movestring.charAt(0) == 'u') {
//          up      = 1;
//          opup    = 1;
//          down    = 0;
//          Buffer.Player().f = 0 + Buffer.anim_toggle;
//          curmove = 'u';
//          movestring = movestring.substring(1);
//          //System.out.println("u:"+movestring);
//        }
//        else if(movestring.charAt(0) == 'd') {
//          down    = 1;
//          opdown  = 1;
//          up      = 0;
//          Buffer.Player().f = 4 + Buffer.anim_toggle;
//          curmove = 'd';
//          movestring = movestring.substring(1);
//          //System.out.println("d:"+movestring);
//        }
//        else if(movestring.charAt(0) == 'l') {
//          left    = 1;
//          opleft  = 1;
//          right   = 0;
//          Buffer.Player().f = 6 + Buffer.anim_toggle;
//          curmove = 'l';
//          movestring = movestring.substring(1);
//          //System.out.println("l:"+movestring);
//        }
//        else {
//        /* Attempt an attack sequence! */
//          targets = Buffer.getAdjacentEnts(true);
//          if(targets.length>0) { mode = 2; atk_type = 0; } //to targeting mode
//          else {
//            //code for going to next player
//            Buffer.getCurdic().setValue(Buffer.Player().x/24,Buffer.Player().y/24,5,(Buffer.playerIndex()+1));
//            Buffer.checkAlive();
//
//            movestring = Buffer.nextPlayer();
//            resetMovement();    //is this causing the problem of continued movement?
//
//            screen.Update(Buffer.Player().x,Buffer.Player().y);
//            mode = 0;
//          }
//        }
//      }
//    }
//
//
//		//tile & sprite animation
//    anim_iterator++;
//    if(anim_iterator>=anim_delay) {
//      anim_iterator = 0;
//      Buffer.getCurdic().updatedic();
//      Buffer.anim_toggle = 1 - Buffer.anim_toggle;
//
//      /* Entity animation */
//      if(Buffer.AnimateAllEnts == true) { //Animate all
//        for(int i=0; i<Buffer.numEnts(); i++) {
//          Buffer.getEnt(i).f = Buffer.getEnt(i).f - (Buffer.getEnt(i).f%2) + Buffer.anim_toggle;
//        }
//      }
//      else { //Animate player only
//        Buffer.Player().f = Buffer.Player().f - (Buffer.Player().f%2) + Buffer.anim_toggle;
//      }
//    }
//
//
//    //block next movement if obstructed!
//
//    int ptx = Buffer.Player().x/24; //player tx
//    int pty = Buffer.Player().y/24; //player ty
//    int fac = Buffer.Player().faction;
//    int spritenum = 0;
//
//      if(Buffer.Player().y%24 == 0) {
//        spritenum = Buffer.getCurdic().getValue(ptx,pty-1,5);
//			  if((Buffer.getCurdic().getValue(ptx,pty-1,3) == 1 ||
//			    (spritenum > 0 && Buffer.getEnt(spritenum-1).faction != fac)) && up == 1) {
//				  up = 0;
//				  opup = 1;
//          newdirection = 1;
//          //if(Buffer.Player().f/2 != 0) { Buffer.Player().f = 0 + Buffer.anim_toggle; }
//			  }
//        spritenum = Buffer.getCurdic().getValue(ptx,pty+1,5);
//			  if((Buffer.getCurdic().getValue(ptx,pty+1,3) == 1 ||
//          (spritenum > 0 && Buffer.getEnt(spritenum-1).faction != fac)) && down == 1) {
//				  down = 0;
//				  opdown = 1;
//          newdirection = 1;
//          //if(Buffer.Player().f/2 != 2) { Buffer.Player().f = 4 + Buffer.anim_toggle; }
//			  }
//		  }
//  		if(Buffer.Player().x%24 == 0) {
//        spritenum = Buffer.getCurdic().getValue(ptx+1,pty,5);
//  			if((Buffer.getCurdic().getValue(ptx+1,pty,3) == 1 ||
//          (spritenum > 0 && Buffer.getEnt(spritenum-1).faction != fac)) && right == 1) {
//  				right = 0;
//  				opright = 1;
//          newdirection = 1;
//          //if(Buffer.Player().f/2 != 1) { Buffer.Player().f = 2 + Buffer.anim_toggle; }
//  		  }
//        spritenum = Buffer.getCurdic().getValue(ptx-1,pty,5);
//  			if((Buffer.getCurdic().getValue(ptx-1,pty,3) == 1 ||
//          (spritenum > 0 && Buffer.getEnt(spritenum-1).faction != fac)) && left == 1) {
//  				left = 0;
//  				opleft = 1;
//          newdirection = 1;
//          //if(Buffer.Player().f/2 != 3) { Buffer.Player().f = 6 + Buffer.anim_toggle; }
//  		  }
//      }
//
//
//    //actual movement
//    int d = Buffer.PixelSkip;
//
//    if(up==1 && Buffer.Player().y>1 )
//    	{
//    	Buffer.Player().y -= d; screen.Update(Buffer.Player().x,Buffer.Player().y);
//    	//if(Buffer.Player().f/2 != 0) { Buffer.Player().f = 0 + Buffer.anim_toggle; }
//    	}
//    else if(down==1 && Buffer.Player().y < (Buffer.getCurdic().getHeight()*24)-24)
//    	{
//    	Buffer.Player().y += d; screen.Update(Buffer.Player().x,Buffer.Player().y);
//    	//if(Buffer.Player().f/2 != 2) { Buffer.Player().f = 4 + Buffer.anim_toggle; }
//    	}
//    else if(left==1 && Buffer.Player().x>1)
//    	{
//    	Buffer.Player().x -= d; screen.Update(Buffer.Player().x,Buffer.Player().y);
//    	//if(Buffer.Player().f/2 != 3) { Buffer.Player().f = 6 + Buffer.anim_toggle; }
//    	}
//    else if(right==1 && Buffer.Player().x < (Buffer.getCurdic().getWidth()*24)-24)
//    	{
//    	Buffer.Player().x += d; screen.Update(Buffer.Player().x,Buffer.Player().y);
//    	//if(Buffer.Player().f/2 != 1) { Buffer.Player().f = 2 + Buffer.anim_toggle; }
//    	}
//
//
//
//    //finish old movement!
//
//
//    else if(up==2 && Buffer.Player().y>1)
//      {
//      if(Buffer.Player().y%24 !=0) { Buffer.Player().y -= d; screen.Update(Buffer.Player().x,Buffer.Player().y); }
//      else {
//      up = 0;
//      newdirection = 1;
//      }
//    }
//
//    else if(down==2 && Buffer.Player().y < (Buffer.getCurdic().getHeight()*24)-24)
//      {
//      if(Buffer.Player().y%24 !=0) { Buffer.Player().y += d; screen.Update(Buffer.Player().x,Buffer.Player().y); }
//      else {
//      down = 0;
//      newdirection = 1;
//      }
//    }
//
//    else if(left==2 && Buffer.Player().x>1)
//      {
//      if(Buffer.Player().x%24 !=0) { Buffer.Player().x -= d; screen.Update(Buffer.Player().x,Buffer.Player().y); }
//      else {
//      left = 0;
//      newdirection = 1;
//      }
//    }
//
//    else if(right==2 && Buffer.Player().x < (Buffer.getCurdic().getWidth()*24)-24)
//      {
//      if(Buffer.Player().x%24 !=0) { Buffer.Player().x += d; screen.Update(Buffer.Player().x,Buffer.Player().y); }
//      else {
//      right = 0;
//      newdirection = 1;
//      }
//    }
//
//    else //if((up+1)/2 != 1 && (down+1)/2 != 1 && (left+1)/2 != 1 && (right+1)/2 != 1)
//    {
//     newdirection = 1;
//    }
//
//    if(newdirection == 1) {
//      if     (up    == 3) { up    = 1; }
//      else if(down  == 3) { down  = 1; }
//      else if(left  == 3) { left  = 1; }
//      else if(right == 3) { right = 1; }
//    }
//
//    //dic repaint
//  	screen.repaint();
//  }
//
//  /*
//   * KEYBOARD BUTTON HANDLING
//   */
//
//	-(void) keyPressed(KeyEvent e) {
//
//    if(Buffer.Player().ai == true && mode<5) {
//      return;
//    }
//
//		/* key becomes "VK_<something>" */
//		int key = e.getKeyCode();
//
//		/* Arrow keys initiate movement by queueing direction*/
//
//    /* Overland walking controls */
//		if(mode == 0) {
//  		if(key == KeyEvent.VK_UP && up != 1) {
//  		/* "up != 1" prevents from queueing movement while the sprite is already
//  		 * moving in the corresponding direction */
//          up      = 3;
//          opup    = 1;
//          down    = 0;
//          Buffer.Player().f = 0 + Buffer.anim_toggle;
//  			}
//  		else if(key == KeyEvent.VK_DOWN && down != 1) {
//  				down    = 3;
//          opdown  = 1;
//  				up      = 0;
//          Buffer.Player().f = 4 + Buffer.anim_toggle;
//  			}
//  		else if(key == KeyEvent.VK_LEFT && left != 1) {
//  				left    = 3;
//          opleft  = 1;
//  				right   = 0;
//          Buffer.Player().f = 6 + Buffer.anim_toggle;
//  			}
//  		else if(key == KeyEvent.VK_RIGHT && right != 1) {
//  				right   = 3;
//  				opright = 1;
//  				left    = 0;
//          Buffer.Player().f = 2 + Buffer.anim_toggle;
//  			}
//  		else if(key == KeyEvent.VK_N) {
//  		  Switchdic(Buffer.nextdic);
//  		}
//	  }
//
//		/* Battle Menu Controls */
//		else if(mode == 1) {
//      if(key == KeyEvent.VK_UP) {
//        if(bm_option < 4) bm_option = 0;
//        else if(bm_option > 10) {
//          bm_option--;
//          spell_lv_choice = Buffer.Player().spell[bm_option-10].level;
//        }
//      }
//      else if(key == KeyEvent.VK_DOWN) {
//        if(bm_option < 4) bm_option = 3;
//        else if(bm_option > 9 && bm_option < 13) {
//          if(Buffer.Player().spell[bm_option-9] != null) {
//            bm_option++;
//            spell_lv_choice = Buffer.Player().spell[bm_option-10].level;
//          }
//        }
//      }
//      else if(key == KeyEvent.VK_LEFT) {
//        if(bm_option < 4) bm_option = 1;
//        else if(bm_option > 9 && bm_option < 13) {
//           if(spell_lv_choice > 1) {
//             spell_lv_choice--;
//             //System.out.println("--:" +spell_lv_choice);
//           }
//        }
//      }
//      else if(key == KeyEvent.VK_RIGHT) {
//        if(bm_option < 4) bm_option = 2;
//        else if(bm_option > 9 && bm_option < 13) {
//           if(spell_lv_choice < Buffer.Player().spell[bm_option-10].level) {
//             spell_lv_choice++;
//             //System.out.println("++:"+spell_lv_choice);
//           }
//        }
//      }
//    }
//
//    /* Target Selection Controls */
//    else if(mode == 2) {
//      if(key == KeyEvent.VK_UP || key == KeyEvent.VK_LEFT) {
//        if(bm_option>0) { bm_option--; }
//        else { bm_option = targets.length-1; }
//      }
//      else if(key == KeyEvent.VK_DOWN || key == KeyEvent.VK_RIGHT) {
//        bm_option++;
//        bm_option = bm_option%targets.length;
//      }
//		}
//
//    /*
//     * SSC is not a browser, but F5 does invoke a screen refresh.
//     * Just in case really ;)
//     */
//		if(key == KeyEvent.VK_F5)
//		{
//		  this.paint(this.getGraphics());
//	  }
//		//if(key == e.VK_ENTER)
//		else if(key == KeyEvent.VK_A || key == KeyEvent.VK_D)
//		{
//      if(mode == 0) {
//        if(Buffer.getCurdic().getValue(Buffer.Player().x/24,Buffer.Player().y/24,5) == 0) {
//          /* TODO: Finish remaining movement */
//		      mode = 1;
//		      bm_option = 0;
//		      }
//		    }
//
//		  /* Mode 1 selection (Attack/Ability/Item/Stay menu) */
//
//		  else if(mode == 1 && bm_option == 0) { /* Select Attack */
//		    targets = Buffer.getAdjacentEnts(true);
//		    if(targets.length>0) { mode = 2; atk_type = 0; } //to targeting mode
//		    else { mode = 0; } //go back to mode 0 if nobody is in range
//		  }
//		  else if(mode == 1 && bm_option == 1) { /* Select Spell/Ability */
//        bm_option = 0;
//        if(Buffer.Player().spell[0] != null) {
//          bm_option = 10;
//          spell_lv_choice = Buffer.Player().spell[0].level;
//        }
//        else {
//          mode = 0;
//          //if(Buffer.Player().spell0 == null) System.out.println("spell0 is null?");
//        }
//		  }
//      else if(mode == 1 && bm_option == 3 && Buffer.DetectTalk() > 0 ) {
//        /* TODO: Add talk events. */
//        mode = 7;
//      }
//      else if(mode == 1 && bm_option>9 && bm_option<14) {
//        targets = Buffer.getAdjacentEnts((new Spell(Buffer.Player().spell[bm_option-10].shortname,spell_lv_choice)));
//        if(targets.length>0 && Buffer.Player().curmp>(new Spell(Buffer.Player().spell[bm_option-10].shortname,spell_lv_choice)).mp_cost)
//        //Buffer.Player().spell[bm_option-10].mp_cost)
//          { mode = 2; atk_type = bm_option - 8; bm_option = 0; } //to targeting mode
//      }
//
//		  else if(mode == 2) { /* Target selected */
//        c.remove(screen);
//
//        if(Buffer.Player().range > 2 && atk_type == 0) { atk_type = 1; }
//
//        if(atk_type == 0) {
//          battle_anim = new MeleeSequencePanel(Buffer.Player(),Buffer.getEnt(getTarget()));
//          battle_anim.setBounds(0,0,(int)(360*Buffer.ScaleRatio),(int)(240*Buffer.ScaleRatio));
//
//          /* TODO: Stop local animation loop? */
//          c.add(battle_anim);
//        }
//
//        else if(atk_type == 1) {
//          ranged_anim = new RangedSequencePanel(Buffer.Player(),Buffer.getEnt(getTarget()));
//          ranged_anim.setBounds(0,0,360*(int)(Buffer.ScaleRatio),(int)(240*Buffer.ScaleRatio));
//
//          /* TODO: Stop local animation loop? */
//          c.add(ranged_anim);
//        }
//
//        else if(atk_type > 1 && atk_type < 6) {
//          spell_anim = new SpellSequencePanel(Buffer.Player(),Buffer.getEnt(getTarget()),new Spell(Buffer.Player().spell[atk_type-2].shortname,spell_lv_choice));
//          spell_anim.setBounds(0,0,360*(int)(Buffer.ScaleRatio),(int)(240*Buffer.ScaleRatio));
//
//          /* TODO: Stop local animation loop? */
//          c.add(spell_anim);
//        }
//
//        this.paint(this.getGraphics());
//        mode = 5;
//        JukeBox.PlayBattleTune();
//      }
//
//      else if(mode == 5) {  //Attack animation is ongoing or ending
//        if(atk_type == 0) {
//          if(battle_anim.Force() == false) {
//
//            c.remove(battle_anim);
//            c.add(screen);
//
//            this.paint(this.getGraphics());
//
//                //code for going to next player
//            Buffer.getCurdic().setValue(Buffer.Player().x/24,Buffer.Player().y/24,5,(Buffer.playerIndex()+1));
//            Buffer.checkAlive();
//
//            movestring = Buffer.nextPlayer();
//            resetMovement();
//
//            screen.Update(Buffer.Player().x,Buffer.Player().y);
//            mode = 0;
//            JukeBox.PlayWalkTune();
//
//          }
//        }
//        else if(atk_type == 1) {
//          if(ranged_anim.Force() == false) {
//            atk_type = 0;
//            c.remove(ranged_anim);
//            c.add(screen);
//
//            this.paint(this.getGraphics());
//
//            //code for going to next player
//            Buffer.getCurdic().setValue(Buffer.Player().x/24,Buffer.Player().y/24,5,(Buffer.playerIndex()+1));
//            Buffer.checkAlive();
//
//            movestring = Buffer.nextPlayer();
//            resetMovement();
//
//            screen.Update(Buffer.Player().x,Buffer.Player().y);
//            mode = 0;
//            JukeBox.PlayWalkTune();
//          }
//        }
//        else if(atk_type > 1 && atk_type < 6) {
//          if(spell_anim.Force() == false) {
//            atk_type = 0;
//            c.remove(spell_anim);
//            c.add(screen);
//
//            this.paint(this.getGraphics());
//
//            //code for going to next player
//            Buffer.getCurdic().setValue(Buffer.Player().x/24,Buffer.Player().y/24,5,(Buffer.playerIndex()+1));
//            Buffer.checkAlive();
//
//            movestring = Buffer.nextPlayer();
//            resetMovement();
//
//            screen.Update(Buffer.Player().x,Buffer.Player().y);
//            mode = 0;
//            JukeBox.PlayWalkTune();
//          }
//        }
//      }
//		  else if(mode == 6) {
//		    mode = 0;
//		  }
//		  else { //"Stay" option selected (or coming out of mode 7)
//
//        if(mode == 7) {
//
//          /* BATTLE SCRIPTED TALK EVENTS SECTION  Specific for Mode 7! */
//
//          /* implement join event after talk */
//          if(Buffer.getEnt(Buffer.DetectTalk()).respevent.equals("join")) {
//            Buffer.getEnt(Buffer.DetectTalk()).faction = Buffer.Player().faction;
//            Buffer.getEnt(Buffer.DetectTalk()).ai = false;
//          }
//          /* in this case. combat ends right after the talk */
//          else if(Buffer.getEnt(Buffer.DetectTalk()).respevent.equals("end combat")) {
//            Switchdic(Buffer.nextdic);
//          }
//        }
//
//		    //code for going to next player
//        Buffer.getCurdic().setValue(Buffer.Player().x/24,Buffer.Player().y/24,5,(Buffer.playerIndex()+1));
//
//		    /* Checking if faction 1 and faction 2 both still have living members*/
//		    boolean f1lives = false;
//		    boolean f2lives = false;
//
//		    for(int i=0; i<Buffer.numEnts(); i++) {
//		      if(Buffer.getEnt(i).faction == 1) {
//		        f1lives = true;
//		      }
//          if(Buffer.getEnt(i).faction > 1) {
//            f2lives = true;
//          }
//		    }
//
//		    /* Factions are there? Go to next turn! */
//		    if(f1lives && f2lives) {
//		      movestring = Buffer.nextPlayer();
//
//
//		    }
//		    /* 1 Faction is gone? */  //WHAT ABOUT IF FACTION 2 IS GONE? ie.. you lose
//		    else {
//		      //go directly to next dic for now...
//		      //FIRST REJUVINATE HP AND MP on force(and auto revive)
//				rejuvinateAll();
//		      //END REJUVINATION/autorevival
//
//          	  Switchdic(Buffer.nextdic);
//		    }
//
//        screen.Update(Buffer.Player().x,Buffer.Player().y);
//        mode = 0;
//      }
//		}
//		else if(key == KeyEvent.VK_S)
//		{
//		  if(mode == 0) { mode = 6; }
//		  else if(mode == 1 && bm_option < 10) { mode = 0; }
//      else if(mode == 1 && bm_option > 9) { bm_option -= 10; }
//		  else if(mode == 2) { mode = 1; }
//		  else if(mode == 6) { mode = 0; }
//		}
//		else if(key == KeyEvent.VK_F && mode == 0)
//		{
//      Buffer.Player().f = (Buffer.Player().f + 2)%8;
//		}
//	}
//
//	-(void) keyTyped(KeyEvent e) { }
//	-(void) keyReleased(KeyEvent e) {
//
//		int key = e.getKeyCode();
//
//		//Releasing the arrow keys stops any future movement in that direction,
//		//but finishes the current move to the next tile
//		if(mode == 0) {
//  		if(key == KeyEvent.VK_UP) {
//  			up = 2;
//  			opup = 0;
//  			if     (opdown  == 1) { down = 1; up    = 0; }
//        else if(opright == 1) { left = 0; right = 3; }
//        else if(opleft  == 1) { left = 3; right = 0; }
//  		}
//
//  		if(key == KeyEvent.VK_DOWN) {
//  			down = 2;
//  			opdown = 0;
//  			if     (opup    == 1) { down = 0; up    = 1; }
//        else if(opright == 1) { left = 0; right = 3; }
//        else if(opleft  == 1) { left = 3; right = 0; }
//  		}
//
//  		if(key == KeyEvent.VK_LEFT) {
//  			left = 2;
//  			opleft = 0;
//  			if     (opright == 1) { left = 0; right = 1; }
//        else if(opup    == 1) { down = 0; up    = 3; }
//        else if(opdown  == 1) { down = 3; up    = 0; }
//  		}
//
//  		if(key == KeyEvent.VK_RIGHT) {
//  			right = 2;
//  			opright = 0;
//  			if     (opleft  == 1) { left = 1; right = 0; }
//        else if(opup    == 1) { down = 0; up    = 3; }
//        else if(opdown  == 1) { down = 3; up    = 0; }
//  		}
//		}
//	}
//
//	-(void) rejuvinateAll() {
//		//cycle through team members, make hp and mp = max.
//		for(int i=0;i<Buffer.Party.size();i++){
//			Buffer.Party.elementAt(i).curhp=Buffer.Party.elementAt(i).maxhp;
//			Buffer.Party.elementAt(i).curmp=Buffer.Party.elementAt(i).maxmp;
//		}
//
//	}
//
// 	-(void) Refocus()
// 	{
// 		prompt.requestFocus();
// 	}
//
// 	/*Start animation routine on focus*/
//	-(void) windowGainedFocus(WindowEvent e)
//	{
//	  timer.start();
//	}
//
//  /*Halt animation routine on unfocus*/
// -(void) windowLostFocus(WindowEvent e) { timer.stop(); }
//}
